home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 17 / CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso / CUCD / Programming / DiceSource / test / swtest.c < prev    next >
C/C++ Source or Header  |  1992-11-23  |  3KB  |  155 lines

  1.  
  2. /*
  3.  *  SWTEST.C
  4.  */
  5.  
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8.  
  9. #define MAXCASES    100
  10.  
  11. long CaseAry[MAXCASES];
  12.  
  13. char *IntType(short, short);
  14.  
  15. main(ac, av)
  16. char *av[];
  17. {
  18.     short size;
  19.     short xsigned;
  20.     short cases;
  21.  
  22.     for (;;) {
  23.     size = rand() % 3;          /*  char, short, long           */
  24.     xsigned = rand() & 1;       /*  signed, else unsigned       */
  25.     cases = rand() % MAXCASES;  /*  number of cases, max 100    */
  26.  
  27.     printf("TEST %d cases for %s\n", cases, IntType(size, xsigned));
  28.  
  29.     TestSwitch(size, xsigned, cases);
  30.     }
  31. }
  32.  
  33. TestSwitch(size, xsigned, cases)
  34. short size;
  35. short xsigned;
  36. short cases;
  37. {
  38.     short i, j;
  39.     FILE *fi;
  40.  
  41.     for (i = 0; i < cases; ++i) {
  42.     long n;
  43. loop:
  44.     n = rand();
  45.     if (size == 0) {        /*  char    */
  46.         if (xsigned)
  47.         n = (char)n;
  48.         else
  49.         n = (unsigned char)n;
  50.     } else if (size == 1) { /*  short   */
  51.         if (xsigned)
  52.         n = (short)n;
  53.         else
  54.         n = (unsigned short)n;
  55.     } else {        /*  long    */
  56.         n = n + rand() << 16;
  57.     }
  58.     for (j = 0; j < i; ++j) {
  59.         if (CaseAry[j] == n)
  60.         goto loop;
  61.     }
  62.     CaseAry[i] = n;
  63.     }
  64.  
  65.     /*
  66.      *    Generate simple program to test all cases
  67.      */
  68.  
  69.     fi = fopen("t:x.c", "w");
  70.     fprintf(fi, "%s TestAry[] = {\n\t", IntType(size, xsigned));
  71.     for (i = 0; i < cases; ++i) {
  72.     if (xsigned)
  73.         fprintf(fi, "%d%s", CaseAry[i], (i < cases - 1) ? "," : "");
  74.     else
  75.         fprintf(fi, "%u%s", CaseAry[i], (i < cases - 1) ? "," : "");
  76.     }
  77.     fprintf(fi, "\n};\n\n");
  78.  
  79.     fprintf(fi, "%s TestIt(%s);\n", IntType(size, xsigned), IntType(size, xsigned));
  80.  
  81.     fprintf(fi, "main()\n{\n");
  82.     fprintf(fi, "    short i;\n");
  83.     fprintf(fi, "    for (i = 0; i < %d; ++i) {\n", cases);
  84.     fprintf(fi, "        if (TestIt(TestAry[i]) != (%s)TestAry[i]) { \n", IntType(size, xsigned));
  85.     fprintf(fi, "            printf(\"case %%d failed\\n\", TestAry[i]);\n");
  86.     fprintf(fi, "            exit(2);\n");
  87.     fprintf(fi, "        }\n");
  88.     fprintf(fi, "    }\n");
  89.     fprintf(fi, "    return(0);\n");
  90.     fprintf(fi, "}\n\n");
  91.  
  92.     fprintf(fi, "%s\n", IntType(size, xsigned));
  93.     fprintf(fi, "TestIt(v)\n");
  94.     fprintf(fi, "%s v;\n", IntType(size, xsigned));
  95.     fprintf(fi, "{\n");
  96.     fprintf(fi, "    switch(v) {\n");
  97.  
  98.     for (i = 0; i < cases; ++i) {
  99.     if (xsigned)
  100.         fprintf(fi, "    case %d:", CaseAry[i]);
  101.     else
  102.         fprintf(fi, "    case %u:", CaseAry[i]);
  103.     fprintf(fi, "return((%s)%d);\n", IntType(size, xsigned), CaseAry[i]);
  104.     }
  105.     fprintf(fi, "    default: printf(\"FAILED %%d\\n\", v); exit(1);\n");
  106.     fprintf(fi, "    }\n");
  107.     fprintf(fi, "    return(0);\n");
  108.     fprintf(fi, "}\n\n");
  109.     fclose(fi);
  110.  
  111.     {
  112.     long r;
  113.  
  114.     puts("dcc t:x.c -o t:x");
  115.     r = system("dcc t:x.c -o t:x");
  116.     if (r) {
  117.         printf("Unable to compile!\n");
  118.         exit(20);
  119.     }
  120.     r = system("t:x");
  121.     if (r) {
  122.         printf("FAILURE %s\n   ", IntType(size, xsigned));
  123.         for (i = 0; i < cases; ++i)
  124.         printf(" %d", CaseAry[i]);
  125.         puts("");
  126.         exit(20);
  127.     }
  128.     }
  129. }
  130.  
  131.  
  132. char *
  133. IntType(size, xsigned)
  134. short size;
  135. short xsigned;
  136. {
  137.     if (size == 0) {
  138.     if (xsigned)
  139.         return("char");
  140.     else
  141.         return("unsigned char");
  142.     } else if (size == 1) {
  143.     if (xsigned)
  144.         return("short");
  145.     else
  146.         return("unsigned short");
  147.     } else {
  148.     if (xsigned)
  149.         return("long");
  150.     else
  151.         return("unsigned long");
  152.     }
  153. }
  154.  
  155.